package br.com.sgc.dao;

import java.util.List;

import javax.ejb.Stateless;

import org.hibernate.Criteria;
import org.hibernate.criterion.MatchMode;
import org.hibernate.criterion.Restrictions;

import br.com.sgc.entities.rh.Funcionario;
import br.com.sgc.entities.seguranca.Usuario;

@Stateless
public class FuncionarioDao extends GenericDao<Funcionario> {

	private static final long serialVersionUID = -4046004706646249834L;

	@SuppressWarnings("unchecked")
	public List<Funcionario> searchFuncionario(Funcionario funcionario){
		List<Funcionario> list = createCriteriaDependecies(funcionario).list();
		for(Funcionario func: list){
			initializeDependecies(func);
		}
		return list;
		
	}
	
	@SuppressWarnings("unchecked")
	public List<Funcionario> searchFuncionarioSemUsuario(Funcionario funcionario){
		Criteria criteria = createCriteriaDependecies(funcionario);
		criteria.add(Restrictions.isNull("usuario"));
		List<Funcionario> list = criteria.list();
		for(Funcionario func: list){
			initializeDependecies(func);
		}
		return list;
		
	}

	private Criteria createCriteriaDependecies(Funcionario funcionario) {
		Criteria criteria = getCriteria(Funcionario.class);
		
		if(funcionario.getNome() != null && !funcionario.getNome().trim().equals("")){
			criteria.add(Restrictions.ilike("nome", funcionario.getNome(), MatchMode.ANYWHERE));
		}
		if(funcionario.getMatricula()!= null && !funcionario.getMatricula().trim().equals("")){
			criteria.add(Restrictions.eq("matricula", funcionario.getMatricula()));
		}
		if(funcionario.getCpf()!= null && !funcionario.getCpf().trim().equals("")){
			criteria.add(Restrictions.eq("cpf", funcionario.getCpf()));
		}
		if(funcionario.getCargo().getId() != null && funcionario.getCargo().getId() != 0){
			criteria.add(Restrictions.eq("cargo.id", funcionario.getCargo().getId()));
		}
		if(funcionario.getFuncao().getId() != null && funcionario.getFuncao().getId() != 0){
			criteria.add(Restrictions.eq("funcao.id", funcionario.getFuncao().getId()));
		}

		return criteria;
	}
	
	

	public Funcionario findFuncionarioByMatricula(String matricula) {
		Criteria criteria = getCriteria(Funcionario.class);
		criteria.add(Restrictions.eq("matricula", matricula));
		Funcionario funcionario = (Funcionario) criteria.uniqueResult();
		initializeDependecies(funcionario);
		return funcionario;
	}

	public Funcionario findByUsuario(Usuario usuarioLogado) {
		Criteria criteria = getCriteria(Funcionario.class);
		criteria.add(Restrictions.eq("usuario.id", usuarioLogado.getId()));
		return (Funcionario) criteria.uniqueResult();
	}
}
